home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / hack / 2_3 / o_init.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-20  |  5.9 KB  |  249 lines

  1. /*    SCCS Id: @(#)o_init.c    2.3    88/01/24
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3.  
  4. #include    "config.h"        /* for typedefs */
  5. #include    "objects.h"
  6. #include    "onames.h"        /* for LAST_GEM */
  7. extern char *index();
  8.  
  9. int
  10. letindex(let) register char let; {
  11. register int i = 0;
  12. register char ch;
  13.     while((ch = obj_symbols[i++]) != 0)
  14.         if(ch == let) return(i);
  15.     return(0);
  16. }
  17.  
  18. init_objects(){
  19. register int i, j, first, last, sum, end;
  20. register char let, *tmp;
  21.  
  22.     /* bug fix to prevent "initialization error" abort on Intel Xenix.
  23.      * reported by mikew@semike
  24.      */
  25.         for(i = 0; i != sizeof(obj_symbols); i++)
  26.                 bases[i] = 0;
  27.  
  28.     /* init base; if probs given check that they add up to 100, 
  29.        otherwise compute probs; shuffle descriptions */
  30.     end = SIZE(objects);
  31.     first = 0;
  32.     while( first < end ) {
  33.         let = objects[first].oc_olet;
  34.         last = first+1;
  35.         while(last < end && objects[last].oc_olet == let
  36.                  && objects[last].oc_name != NULL) last++;
  37.         i = letindex(let);
  38.         if((!i && let != ILLOBJ_SYM) || bases[i] != 0)
  39.             error("initialization error");
  40.         bases[i] = first;
  41.  
  42.         if(let == GEM_SYM) setgemprobs();
  43.     check:
  44.         sum = 0;
  45.         for(j = first; j < last; j++) sum += objects[j].oc_prob;
  46.         if(sum == 0) {
  47.             for(j = first; j < last; j++)
  48.                 objects[j].oc_prob = (100+j-first)/(last-first);
  49.             goto check;
  50.         }
  51.         if(sum != 100)
  52.             error("init-prob error for %c (%d%%)", let, sum);
  53.  
  54.         if(objects[first].oc_descr != NULL && let != TOOL_SYM){
  55.             /* shuffle, also some additional descriptions */
  56.             while(last < end && objects[last].oc_olet == let)
  57.                 last++;
  58.             j = last;
  59.             if (let == GEM_SYM) {
  60.                 while(--j > first)
  61.                 /* NOTE:  longest color name must be default */
  62.                 if(!strcmp(objects[j].oc_name,"turquoise")) {
  63.                     if(rn2(2)) /* change from green? */
  64.                     strcpy(objects[j].oc_descr,"blue");
  65.                 } else if (!strcmp(objects[j].oc_name,"aquamarine")) {
  66.                     if(rn2(2)) /* change from green? */
  67.                     strcpy(objects[j].oc_descr,"blue");
  68.                 } else if (!strcmp(objects[j].oc_name,"fluorite")) {
  69.                     switch (rn2(4)) { /* change from violet? */
  70.                     case 0:  break;
  71.                     case 1:
  72.                         strcpy(objects[j].oc_descr,"blue");
  73.                         break;
  74.                     case 2:
  75.                         strcpy(objects[j].oc_descr,"white");
  76.                         break;
  77.                     case 3:
  78.                         strcpy(objects[j].oc_descr,"green");
  79.                         break;
  80.                     }
  81.                 }
  82.             } else
  83.                 while(--j > first) {
  84.                 i = first + rn2(j+1-first);
  85.                 tmp = objects[j].oc_descr;
  86.                 objects[j].oc_descr = objects[i].oc_descr;
  87.                 objects[i].oc_descr = tmp;
  88.                 }
  89.         }
  90.         first = last;
  91.     }
  92. }
  93.  
  94. probtype(let) register char let; {
  95. register int i = bases[letindex(let)];
  96. register int prob = rn2(100);
  97.     while((prob -= objects[i].oc_prob) >= 0) i++;
  98.     if(objects[i].oc_olet != let || !objects[i].oc_name)
  99.         panic("probtype(%c) error, i=%d", let, i);
  100.     return(i);
  101. }
  102.  
  103. setgemprobs()
  104. {
  105.     register int j,first;
  106.     extern xchar dlevel;
  107.  
  108.     first = bases[letindex(GEM_SYM)];
  109.  
  110.     for(j = 0; j < 9-dlevel/3; j++)
  111.         objects[first+j].oc_prob = 0;
  112.     first += j;
  113.     if(first >= LAST_GEM || first >= SIZE(objects) ||
  114.         objects[first].oc_olet != GEM_SYM ||
  115.         objects[first].oc_name == NULL)
  116.         printf("Not enough gems? - first=%d j=%d LAST_GEM=%d\n",
  117.             first, j, LAST_GEM);
  118.     for(j = first; j < LAST_GEM; j++)
  119.         objects[j].oc_prob = (18+j-first)/(LAST_GEM-first);
  120. }
  121.  
  122. oinit()            /* level dependent initialization */
  123. {
  124.     setgemprobs();
  125. }
  126.  
  127. extern long *alloc();
  128.  
  129. savenames(fd) register fd; {
  130. register int i;
  131. unsigned len;
  132. struct objclass *now = &objects[0];
  133.     bwrite(fd, (char *) &now, sizeof now);
  134.     bwrite(fd, (char *) bases, sizeof bases);
  135.     bwrite(fd, (char *) objects, sizeof objects);
  136.     /* as long as we use only one version of Hack/Quest we
  137.        need not save oc_name and oc_descr, but we must save
  138.        oc_uname for all objects */
  139.     for(i=0; i < SIZE(objects); i++) {
  140.         if(objects[i].oc_uname) {
  141.             len = strlen(objects[i].oc_uname)+1;
  142.             bwrite(fd, (char *) &len, sizeof len);
  143.             bwrite(fd, objects[i].oc_uname, len);
  144.         }
  145.     }
  146. }
  147.  
  148. restnames(fd) register fd; {
  149. register int i;
  150. unsigned len;
  151. struct objclass *then;
  152. long differ;
  153.     mread(fd, (char *) &then, sizeof then);
  154.     mread(fd, (char *) bases, sizeof bases);
  155.     mread(fd, (char *) objects, sizeof objects);
  156. #ifndef MSDOS
  157.     differ = (char *)&objects[0] - (char *)then;
  158. #else
  159.     differ = (long)&objects[0] - (long)then;
  160. #endif
  161.     for(i=0; i < SIZE(objects); i++) {
  162.         if (objects[i].oc_name) {
  163. #ifndef MSDOS
  164.             objects[i].oc_name += differ;
  165. #else
  166.             objects[i].oc_name =
  167.                 (char *)((long)(objects[i].oc_name) + differ);
  168. #endif
  169.         }
  170.         if (objects[i].oc_descr) {
  171. #ifndef MSDOS
  172.             objects[i].oc_descr += differ;
  173. #else
  174.             objects[i].oc_descr =
  175.                 (char *)((long)(objects[i].oc_descr) + differ);
  176. #endif
  177.         }
  178.         if (objects[i].oc_uname) {
  179.             mread(fd, (char *) &len, sizeof len);
  180.             objects[i].oc_uname = (char *) alloc(len);
  181.             mread(fd, objects[i].oc_uname, len);
  182.         }
  183.     }
  184. }
  185.  
  186. dodiscovered()                /* free after Robert Viduya */
  187. {
  188.     extern char *typename();
  189.     register int i, end;
  190.     int    ct = 0;
  191. #ifdef DGKMOD
  192.     char class = -1;
  193.     extern char *let_to_name();
  194. #endif
  195.  
  196.     cornline(0, "Discoveries");
  197.  
  198.     end = SIZE(objects);
  199.     for (i = 0; i < end; i++) {
  200.     if (interesting_to_discover (i)) {
  201.         ct++;
  202. #ifdef DGKMOD
  203.         if (objects[i].oc_olet != class) {
  204.         class = objects[i].oc_olet;
  205.         cornline(1, let_to_name(class));
  206.         }
  207. #endif
  208.         cornline(1, typename(i));
  209.     }
  210.     }
  211.     if (ct == 0) {
  212.     pline ("You haven't discovered anything yet...");
  213.     cornline(3, (char *) 0);
  214.     } else
  215.     cornline(2, (char *) 0);
  216.  
  217.     return(0);
  218. }
  219.  
  220. interesting_to_discover(i)
  221. register int i;
  222. {
  223.     return(
  224.     objects[i].oc_uname != NULL ||
  225.      (objects[i].oc_name_known && objects[i].oc_descr != NULL)
  226.     );
  227. }
  228.  
  229. init_corpses() {
  230.  
  231. #ifdef SPIDERS
  232.     strcpy(objects[DEAD_GIANT_SPIDER].oc_name, "dead giant spider");
  233. #endif
  234.  
  235. #ifdef KOPS
  236.     strcpy(objects[DEAD_KOP].oc_name, "dead Kop");
  237. # endif
  238.  
  239. #ifdef ROCKMOLE
  240.     strcpy(objects[DEAD_ROCKMOLE].oc_name, "dead rockmole");
  241. #endif
  242.  
  243. #ifndef KAA
  244.     strcpy(objects[DEAD_QUASIT].oc_name, "dead quasit");
  245.     strcpy(objects[DEAD_VIOLET_FUNGI].oc_name, "dead violet fungi");
  246. #endif
  247.     return(0);
  248. }
  249.